package scala

object Demo13Fun2 {
  def main(args: Array[String]): Unit = {

    /**
      *
      * 面向对象编程：将一个对象传来传去，
      * 1、将一个对象作为参数
      * 2、将一个对象作为返回值
      *
      * 需要明确对象的类型，以及参数的类型，返回指的类型
      *
      *
      * 面向函数编程（高阶函数），将一个函数传来传去
      * 1、将一个函数作为参数  -- 重点
      * 2、将一个函数作为返回值  -- 忽略
      *
      * 所以需要明确函数的类型
      *
      * 函数的类型和返回值，参数有关，和函数名，函数体无关
      *
      *
      *
      * def stringToInt(str: String): Int = str.toInt
      * 这是一个参数为String  返回值为Int 类型的函数
      *
      *
      */

    def stringToInt(str: String): Int = str.toInt


    /**
      * 1、以函数作为参数
      *
      *
      * String => Int
      * 前面代表的是参数的类型
      * 后面代表的是返回值的类型
      *
      */


    //fun的参数是一个函数，是一个参数为String返回值为Int类型的函数
    def fun(f: String => Int): Unit = {

      //f 相当于函数的引用
      val i: Int = f("1000")

      println("fun:" + i)

    }


    //定义一个参数为String 返回值为Int类型的函数
    def sToi(s: String): Int = {
      s.toInt
    }

    //调用 fun，  需要一个参数为String  返回值为Int 类型的函数
    fun(sToi)

    def sToi2(s: String): Int = {
      s.toInt + 100
    }

    //可以多次调用传入不同的函数
    fun(sToi2)


  }

}
